#ifndef INTERFACE_H
#define INTERFACE_H

#include <QObject>

#include "defs.h"
#include "errorcode.h"

class Interface
{
public:

    // 注册
    virtual void registerUser(Core::User &user) = 0;
    // 更新
    virtual void updateUser(Core::User &user) = 0;

    // 登录
    virtual void login(Core::User &user) = 0;
    virtual void logout(Core::User &user)  {};

    // 添加动漫
    virtual void addAnime(Core::Anime &anime) = 0;
    // 删除动漫
    virtual void deleteAnime(Core::Anime &anime) = 0;
    // 更新动漫
    virtual void updateAnime(Core::Anime &anime) = 0;
    // 通过名称查找动漫
    virtual void getAnimeByName(QString name) = 0;
    // 获取所有动漫信息
    virtual QList<Core::Anime> getAllAnimes() = 0;

    // 评论动漫
    virtual void commentAnime(Core::Comment &comment) = 0;
    // 审核动漫评论
    virtual void acceptComment(Core::Comment &comment) = 0;
    // 审核动漫评论
    virtual void rejectComment(Core::Comment &comment) = 0;
    // 获取待审核动漫
    virtual QList<Core::Comment> getPendingComment() = 0;

    // 分类浏览
    virtual void browseByCategory(QString category) = 0;

    // 标签浏览
    virtual QList<Core::Anime> browseByTag(Core::Filter &fileter) = 0;

    // 发帖
    virtual void post(Core::Post &post) = 0;
    // 获取最新的十条帖子
    virtual QList<Core::Post> getPosts(int cnt) = 0;
    // 审核帖子
    virtual void acceptpost(Core::Post &comment) = 0;
    // 审核帖子
    virtual void rejectpost(Core::Post &comment) = 0;
    // 获取待审核帖子
    virtual QList<Core::Post> getPendingPost() = 0;
    // 评论帖子
    virtual void postComment(Core::PostComment &comment) = 0;
    // 点赞帖子
    virtual void likePost(Core::LikePost &likePost) = 0;


};

class XInterface : public QObject, public Interface
{
    Q_OBJECT
public:
    XInterface(QObject *parent = nullptr) : QObject(parent) {};

    // 注册
    virtual void registerUser(Core::User &user) = 0;
    // 更新
    virtual void updateUser(Core::User &user) = 0;

    // 登录
    virtual void login(Core::User &user) = 0;

    // 添加动漫
    virtual void addAnime(Core::Anime &anime) = 0;
    // 删除动漫
    virtual void deleteAnime(Core::Anime &anime) = 0;
    // 更新动漫
    virtual void updateAnime(Core::Anime &anime) = 0;
    // 通过名称查找动漫
    virtual void getAnimeByName(QString name) = 0;
    // 获取所有动漫信息
    virtual QList<Core::Anime> getAllAnimes() = 0;

    // 分类浏览
    virtual void browseByCategory(QString category) = 0;

    // 标签浏览
    virtual QList<Core::Anime> browseByTag(Core::Filter &fileter) = 0;

    // 评论动漫
    virtual void commentAnime(Core::Comment &comment) = 0;
    // 审核动漫评论
    virtual void acceptComment(Core::Comment &comment) = 0;
    // 审核动漫评论
    virtual void rejectComment(Core::Comment &comment) = 0;
    // 获取待审核动漫
    virtual QList<Core::Comment> getPendingComment() = 0;

    // 发帖
    virtual void post(Core::Post &post) = 0;
    // 获取最新的十条帖子
    virtual QList<Core::Post> getPosts(int cnt) = 0;
    // 审核帖子
    virtual void acceptpost(Core::Post &comment) = 0;
    // 审核帖子
    virtual void rejectpost(Core::Post &comment) = 0;
    // 获取待审核帖子
    virtual QList<Core::Post> getPendingPost() = 0;
    // 评论帖子
    virtual void postComment(Core::PostComment &comment) = 0;
    // 点赞帖子
    virtual void likePost(Core::LikePost &likePost) = 0;

    inline Core::User *getCurrentUser() const
    {
        return m_currentUser;
    }

    inline int getLastError() const
    {
        return errorCode;
    }
    inline QString getLastErrorString() const
    {
        return GetErrorMessage(ErrorCode(errorCode));
    }

    virtual bool sendPix(int postId)
    {
        Q_UNUSED(postId)
        return true;
    }


    Core::User *m_currentUser{nullptr};
    Core::Filter filter;
    QByteArray m_pix_buf;

signals:
    // 用户注册完成信号
    void registerFinished(int ret);

    // 用户登录完成信号
    void loginFinished(int ret);

    void logoutFinished(int ret);

    // 用户修改完成信号
    void updateUserFinished(int ret);

    // 添加动漫完成信号
    void addAnimeFinished(int ret);
    // 删除动漫完成信号
    void deleteAnimeFinished(int ret);
    // 更新动漫完成信号
    void updateAnimeFinished(int ret);
    // 获取所有动漫动漫完成信号
    void getAllAnimeFinished(int ret, QList<Core::Anime> animes);
    // 过滤动漫完成信号
    void getFilterAnimeFinished(int ret, QList<Core::Anime> animes);
    // 发帖完成信号
    void postFinished(int ret);
    void getPendingPostFinished(int ret, QList<Core::Post> posts);

    // 评论完成信号
    void commentFinished(int ret);
    void getPendingCommentFinished(int ret, QList<Core::Comment> comments);

    void getAllPostsFinished(int ret, QList<Core::Post> posts);

    void postCommentFinished(int ret);

    // 动漫操作完成信号
    void animeOperationFinished(int ret);

    // 点赞完成信号
    void likePostFinished(int ret);

    void sig_havePixPostShow(int ret, Core::PixFromPost info);

protected:
    inline void setErrorCode(int code)
    {
        errorCode = code;
    }

protected:

    int errorCode{0};

};

#endif // INTERFACE_H

